package org.cos.verifier.utility;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

//import javax.microedition.io.Connector;

public class IOWrapper {
	static IOWrapper instance;

	private IOWrapper() {
	};

	public static IOWrapper get_inst() {
		if (instance == null)
			instance = new IOWrapper();
		return instance;
	}

	public String read_res_UTF(String name) {
		String strReturn = "";
		InputStream in = null;
		byte[] word_utf = new byte[10240];
		try {
			in = getClass().getResourceAsStream(name);
			in.read(word_utf);
			in.close();
			strReturn = new String(word_utf, "UTF-8");
		} catch (Exception e) {
			System.out.println("readUTF Error:" + e.toString());
		} finally {
			in = null;
		}
		return strReturn;
	}
	
	public byte[] read_file(String name) throws IOException {
		FileInputStream filein = new FileInputStream(name);
		byte buf[] = new byte[256];
		byte data[] = null;
		int len = 1024;
		data = new byte[len];// 先初步设定一个1k的内存空间

		int ch;
		int index = 0;		// 读取的数据的总索引
		while ((ch = filein.read()) != -1) {
			data[index] = (byte) ch;
			index++;
			if (index >= len) {
				len += 1024;
				buf = new byte[len];
				System.arraycopy(data, 0, buf, 0, index);
				data = null;
				data = buf;
			}
		}
		// 此时data[]的长度可能要比实际数据多，最后的一些字节可能是一些无效的数据，去掉无效数据
		if ((index % 1024) != 0) {
			buf = new byte[index];// index的值是数据的实际大小
			System.arraycopy(data, 0, buf, 0, index);
			data = null;
			data = buf;
		}

		if (filein != null) {
			filein.close();
			filein = null;
		}
				
		return data;

	}
	
	public void write_file(String name, byte[] raw) throws IOException {
		FileOutputStream fileout = new FileOutputStream(name, false);
		fileout.write(raw);
		fileout.flush();
		fileout.close();
		return ;
	}
	
	public String get_app_path(Class cls){  
	    //检查用户传入的参数是否为空  
	    if(cls==null)   
	     throw new java.lang.IllegalArgumentException("参数不能为空！");  
	    ClassLoader loader=cls.getClassLoader();  
	    //获得类的全名，包括包名  
	    String clsName=cls.getName()+".class";  
	    //获得传入参数所在的包  
	    Package pack=cls.getPackage();  
	    String path="";  
	    //如果不是匿名包，将包名转化为路径  
	    if(pack!=null){  
	        String packName=pack.getName();  
	       //此处简单判定是否是Java基础类库，防止用户传入JDK内置的类库  
	       if(packName.startsWith("java.")||packName.startsWith("javax."))   
	          throw new java.lang.IllegalArgumentException("不要传送系统类！");  
	        //在类的名称中，去掉包名的部分，获得类的文件名  
	        clsName=clsName.substring(packName.length()+1);  
	        //判定包名是否是简单包名，如果是，则直接将包名转换为路径，  
	        if(packName.indexOf(".")<0) path=packName+"/";  
	        else{ //否则按照包名的组成部分，将包名转换为路径  
	            int start=0,end=0;  
	            end=packName.indexOf(".");  
	            while(end!=-1){  
	                path=path+packName.substring(start,end)+"/";  
	                start=end+1;  
	                end=packName.indexOf(".",start);  
	            }  
	            path=path+packName.substring(start)+"/";  
	        }  
	    }  

	    if (loader == null) {
	    	return "";
	    }
	    //调用ClassLoader的getResource方法，传入包含路径信息的类文件名  
	    java.net.URL url =loader.getResource(path+clsName);  
	    //从URL对象中获取路径信息  

	    String realPath=url.getPath();  
	    //去掉路径信息中的协议名"file:"  
	    int pos=realPath.indexOf("file:");  

	    if(pos>-1) realPath=realPath.substring(pos+5);  
	    //去掉路径信息最后包含类文件信息的部分，得到类所在的路径  
	    pos=realPath.indexOf(path+clsName);  
	    realPath=realPath.substring(0,pos-1);  
	    //如果类文件被打包到JAR等文件中时，去掉对应的JAR等打包文件名  
	    if(realPath.endsWith("!"))  
	        realPath=realPath.substring(0,realPath.lastIndexOf("/"));  
	  /*------------------------------------------------------------ 
	   ClassLoader的getResource方法使用了utf-8对路径信息进行了编码，当路径 
	    中存在中文和空格时，他会对这些字符进行转换，这样，得到的往往不是我们想要 
	    的真实路径，在此，调用了URLDecoder的decode方法进行解码，以便得到原始的 
	    中文及空格路径 
	  -------------------------------------------------------------*/  
	  try{  
	    realPath=java.net.URLDecoder.decode(realPath,"utf-8");  
	   }catch(Exception e){throw new RuntimeException(e);}  
	   return realPath + "/";  
	}//getAppPath定义结束  
}
